var express = require('express');
var router = express.Router();
var sql = require('./../sql');
var User = require('./../sql/col/users');
var { validateToken, sendCode } = require('./../utils')
var md5 = require('md5'); // 密码加密
var uuid = require('node-uuid'); // 生成用户id
var jwt = require('jsonwebtoken'); // token模块

let ckmacode = 0

router.get('/', function(req, res, next) {
  res.send('用户相关接口');
});


/**
 * @api {post} api/user/telregisterlogin 电话注册并登录功能
 * @apiDescription 注册功能
 * @apiGroup user
 * @apiParam { string } tel 电话
 * @apiParam { string } ckma 验证码
 * @apiSuccessExample { json } Success-Response:
 * {
 *  code: '10400',
 *  message: '请完善表单信息'
 * }
 * {
 *  code: '10666',
 *  message: '注册成功'
 * }
* {
 *  code: '10606',
 *  message: '该用户已注册'
 * }
 * @apiSampleRequest /api/user/telregisterlogin
 * @apiVersion 1.0.0
 */
router.post('/telregisterlogin', (req, res, next) => {
  // 1.获取用户提交的 手机号 和 密码 --- （去除首位空格）
  let { tel, ckma } = req.body
  tel = tel.trim()
  ckma = ckma.trim()
  // 2.判断手机号个密码是否为空
  if (!tel || !ckma) { // 如果用户没有输入手机号和密码提示并且不再继续往下执行
    res.send({
      code: '10400',
      message: '请完善表单信息'
    })
    return
  }
  // 3.依据手机号查询数据库，有没有该用户
  sql.find(User, { tel }, { _id: 0 }).then(data => {
    if (data.length === 0) { // 3.1 没有查到，可以完成注册
      // 4.注册
      if(ckma != ckmacode){
          res.send({
            code: '10555',
            message: '注册失败，验证码不正确'
          })
      } else {
          let id = 'user_' + uuid.v1()
          const obj = {
            userid: id,
            tel,
            password: '',
            nickname: '请设置昵称',
            sex: -1, // 还未设置性别
            avatar: '',
            email: '',
            member: 0
          }
          sql.insert(User, obj).then(() => {
            // 验证成功后，服务端会签发一个 Token，把这个 Token 发送给客户端。
            // 生成token
            let token = jwt.sign({ tel, ckmacode }, 'hesiliao', {
              expiresIn: 10 * 24 * 60 * 60 // 10天有效期
            })
            res.send({
              code: '10666',
              message: '注册成功',
              data: {
                userid: id,
                nickname: tel,
                token
              }
            })
          })
      }
    } else { 
      
      // 3.2 查询到该用户
      if(ckma != ckmacode){
          res.send({
            code: '10555',
            message: '注册失败，验证码不正确'
          })
      } else {
          let token = jwt.sign({ tel, ckmacode }, 'hesiliao', {
            expiresIn: 10 * 24 * 60 * 60 // 10天有效期
          })
          res.send({
            code: '10888',
            message: '登陆成功',
            data: {
              userid: data[0].userid,
              nickname: data[0].nickname,
              token
            }
          })
      }
      
    }
  })
})


/**
 * @api {post} api/user/emailregister 邮箱注册功能
 * @apiDescription 注册功能
 * @apiGroup user
 * @apiParam { string } email 邮箱
 * @apiParam { string } password 密码
 * @apiSuccessExample { json } Success-Response:
 * {
 *  code: '10400',
 *  message: '请完善表单信息'
 * }
 * {
 *  code: '10666',
 *  message: '注册成功'
 * }
* {
 *  code: '10606',
 *  message: '该用户已注册'
 * }
 * @apiSampleRequest /api/user/emailregister
 * @apiVersion 1.0.0
 */
router.post('/emailregister', (req, res, next) => {
  // 1.获取用户提交的 手机号 和 密码 --- （去除首位空格）
  let { email, password } = req.body
  email = email.trim()
  password = password.trim()
  // 2.判断手机号个密码是否为空
  if (!email || !password) { // 如果用户没有输入手机号和密码提示并且不再继续往下执行
    res.send({
      code: '10400',
      message: '请完善表单信息'
    })
    return
  }
  // 3.依据手机号查询数据库，有没有该用户
  sql.find(User, { email }, { _id: 0 }).then(data => {
    if (data.length === 0) { // 3.1 没有查到，可以完成注册
      // 4.注册
      password = md5(password)
      const obj = {
        userid: 'user_' + uuid.v1(),
        tel: '',
        password,
        nickname: '请设置昵称',
        sex: -1, // 还未设置性别
        avatar: '',
        email,
        member: 0
      }
      sql.insert(User, obj).then(() => {
        res.send({
          code: '10666',
          message: '注册成功'
        })
      })
    } else { // 3.2 查询到该用户，提示已注册，请登录
      res.send({
        code: '10606',
        message: '该用户已注册'
      })
    }
  })
})
/**
 * @api {post} api/user/emaillogin 邮箱登陆功能
 * @apiDescription 登陆功能
 * @apiGroup user
 * @apiParam { string } email 邮箱
 * @apiParam { string } password 密码
 * @apiSuccessExample { json } Success-Response:
 * {
 *  code: '10400',
 *  message: '请完善表单信息'
 * }
 * {
 *  code: '10888',
 *  message: '登陆成功'
 * }
* {
 *  code: '10808',
 *  message: '该用户未注册'
 * }
 * @apiSampleRequest /api/user/emaillogin
 * @apiVersion 1.0.0
 */
router.post('/emaillogin', (req, res, next) => {
  // 1.获取信息，去除空格
  let { email, password } = req.body
  email = email.trim()
  password = password.trim()
  
  // 2.判断信息是否填写完整
  if (!email || !password) {
    res.send({
      code: '10400',
      message: '请完善表单信息'
    })
    return
  }
  // 3.依据手机号码查询数据库，看该用户是不是未注册
  sql.find(User, { email }, { _id: 0 }).then(data => {
    if (data.length > 0) { // 3.1有该用户 --- 执行登陆操作
      // 4.登陆 根据手机号和密码一起查询数据库，如果查到表示可以登录，查不到密码错误 --- 密码先加密再查询
      password = md5(password);
      sql.find(User, { email, password }, { _id:0 }).then(result => {
        // 依据长度判断
        if (result.length === 0) {
          res.send({
            code: '10505',
            message: '密码错误'
          })
        } else {
          // 验证成功后，服务端会签发一个 Token，把这个 Token 发送给客户端。
          // 生成token
          let token = jwt.sign({ email, password }, 'hesiliao', {
            expiresIn: 10 * 24 * 60 * 60 // 10天有效期
          })
          res.send({
            code: '10888',
            message: '登陆成功',
            data: {
              userid: data[0].userid,
              nickname: data[0].nickname,
              token
            }
          })
        }
      })

    } else { // 查无此用户，表示还没有注册
      res.send({
        code: '10808',
        message: '该用户未注册'
      })
    }
  })
})

/**
 * @api {post} api/user/tellogin 电话密码登录功能
 * @apiDescription 登陆功能
 * @apiGroup user
 * @apiParam { string } tel 手机号
 * @apiParam { string } pwd 密码
 * @apiSuccessExample { json } Success-Response:
 * {
 *  code: '10400',
 *  message: '请完善表单信息'
 * }
 * {
 *  code: '10888',
 *  message: '登陆成功'
 * }
* {
 *  code: '10808',
 *  message: '该用户未注册'
 * }
 * @apiSampleRequest /api/user/tellogin
 * @apiVersion 1.0.0
 */
router.post('/tellogin', (req, res, next) => {
  // 1.获取信息，去除空格
  let { tel, password } = req.body
  tel = tel.trim()
  password = password.trim()
  
  // 2.判断信息是否填写完整
  if (!tel || !password) {
    res.send({
      code: '10400',
      message: '请完善表单信息'
    })
    return
  }
  // 3.依据手机号码查询数据库，看该用户是不是未注册
  sql.find(User, { tel }, { _id: 0 }).then(data => {
    if (data.length > 0) { // 3.1有该用户 --- 执行登陆操作
      // 4.登陆 根据手机号和密码一起查询数据库，如果查到表示可以登录，查不到密码错误 --- 密码先加密再查询
      password = md5(password);
      sql.find(User, { tel, password }, { _id:0 }).then(result => {
        // 依据长度判断
        if (result.length === 0) {
          res.send({
            code: '10505',
            message: '密码错误'
          })
        } else {
          // 验证成功后，服务端会签发一个 Token，把这个 Token 发送给客户端。
          // 生成token
          let token = jwt.sign({ tel, password }, 'hesiliao', {
            expiresIn: 10 * 24 * 60 * 60 // 10天有效期
          })
          res.send({
            code: '10888',
            message: '登陆成功',
            data: {
              userid: data[0].userid,
              nickname: data[0].nickname,
              token
            }
          })
        }
      })

    } else { // 查无此用户，表示还没有注册
      res.send({
        code: '10808',
        message: '该用户未注册'
      })
    }
  })
})

function getRadom () {
  return Math.floor(Math.random() * 10000) + 1000
}
/**
 * @api {get} api/user/sendCode 发送短信验证码
 * @apiDescription 发送短信验证码
 * @apiGroup user
 * @apiParam { string } tel 发送短信验证码
 * @apiSuccessExample { json } Success-Response:
 * res.send({
        code: '200',
        message: '发送短信验证码',
        code
      })
 * @apiSampleRequest /api/user/sendCode
 * @apiVersion 1.0.0
 */
router.get('/sendCode', (req, res, next) => {
  let { tel } = req.query
  ckmacode = getRadom()
  console.log(ckmacode);
  let accessKeyId = 'LTAIZQoVVoPuBjU9' // 自己申请
  let accessKeySecret = 'GfJuI2dLsCQh7Q56TmFxPTniXjkVnB' // 自己申请
  sendCode(tel, ckmacode, accessKeyId, accessKeySecret).then(() => {
    setTimeout(()=>{
        ckmacode = 0
    },1000*60*5)
    res.send({
      code: '200',
      message: '发送短信验证码成功',
      data: ckmacode
    })
  }).catch(() => {
    res.send({
      code: '555',
      message: '发送短信验证码失败'
    })
  })
})

/**
 * @api {post} api/user/updateAvatar 更新头像
 * @apiDescription 更新头像
 * @apiGroup user
 * @apiParam { string } userid 用户id
 * @apiParam { string } token 验证登陆令牌
 * @apiParam { string } avatar 昵称
 * @apiSuccessExample { json } Success-Response:
 * res.send({
      code: '200',
      message: '更新头像',
      data
    })
 * res.send({
    code: '10119',
    message: 'token验证失败'
  })
 * @apiSampleRequest /api/user/updateAvatar
 * @apiVersion 1.0.0
 */
router.post('/updateAvatar', (req, res, next) => {
  validateToken(req).then(() => {
    let { userid, avatar } = req.body
    sql.update(User, { userid }, { $set: { avatar } }).then(() => {
      res.send({
        code: '200',
        message: '更新头像'
      })
    })
  }).catch(() => {
    res.send({
      code: '10119',
      message: 'token验证失败'
    })
  })
})

module.exports = router;
